#include "widget.h"
#include "ui_widget.h"

#include <qdebug.h>

#include "SerialConfig.h"
#include "led.h"


Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{
    ui->setupUi(this);

    this->setWindowTitle("SerialTool");

    m_serial = new QSerialPort(this);
    m_timer = new QTimer(this);
    m_autoSendThread = new MyThread(this);

    m_autoSendThread->start();


    // 设置自动发送时间间隔上下限
    ui->spinBoxAutoSendSpace->setRange(100, 1000000);

    // 红灯
    setLED(ui->label_led, 1, 20);

    // 加载可用端口
    LoadPortToComboBox(ui->comboBoxPort);

    // 加载可用波特率
    LoadBaudToComboBox(ui->comboBoxBaud);


    // 绑定有数据可读的事件
    connect(m_serial, &QSerialPort::readyRead, this, serial_readyRead);

    connect(m_timer, &QTimer::timeout, this, TimerTimeout);
}

Widget::~Widget()
{
    if (m_serial->isOpen())
    {
        m_serial->close();
    }
    delete m_serial;

    delete m_timer;

    delete ui;
}

/**
 * @brief 自定义波特率设置
 */
void Widget::CustomBaudSet()
{
    QString str = ui->comboBoxBaud->lineEdit()->text();

    ui->comboBoxBaud->setEditable(false);
    ui->comboBoxBaud->setItemText(ui->comboBoxBaud->currentIndex(), str);
    qDebug() << ui->comboBoxBaud->currentIndex();

    qDebug() << m_pBaudLineEdit->text();
}

/**
 * @brief 波特率下拉列表回调
 */
void Widget::slotBaudSelect()
{
    if (ui->comboBoxBaud->currentData() == -1)
    {
        qDebug() << ui->comboBoxBaud->currentIndex();

        ui->comboBoxBaud->setEditable(true);

        m_pBaudLineEdit = ui->comboBoxBaud->lineEdit();
        //m_pBaudLineEdit->setValidator(0);
        m_pBaudLineEdit->selectAll();
        connect(m_pBaudLineEdit, &QLineEdit::editingFinished, this, CustomBaudSet);
    }
}

/**
 * @brief 打开串口按钮回调
 */
void Widget::on_btnOpenSerialPort_clicked()
{
    QString serialPortName; // 名字
    QString baudRate; // 波特率
    QString dataBit; // 数据位
    QString checkBit; // 校验位
    QString stopBit; // 停止位
    QString streamControl; // 流控制

    /* 获取用户选择的配置 */
    serialPortName = ui->comboBoxPort->currentText();
    baudRate = ui->comboBoxBaud->currentText();
    dataBit = ui->comboBoxDataWidth->currentText();
    checkBit = ui->comboBoxCheckBit->currentText();
    stopBit = ui->comboBoxStopBit->currentText();
    streamControl = ui->comboBoxStreamControl->currentText();

    /* 设置串口 */
    m_serial->setPortName(serialPortName);
    m_serial->setBaudRate(baudRate.toInt());
    m_serial->setDataBits(ParseDataBit(dataBit));
    m_serial->setStopBits(ParseStopBit(stopBit));
    m_serial->setParity(ParseCheckBit(checkBit));
    m_serial->setFlowControl(ParseStreamControl(streamControl));

    /* 打开串口 */
    if (m_serial->isOpen())
    {
        m_serial->close();
        m_isOpen = false;
        ui->btnOpenSerialPort->setText("打开串口");
        setLED(ui->label_led, 1, 20); // 红灯
    }
    else
    {
        m_serial->open(QSerialPort::ReadWrite);
        if (m_serial->isOpen())
        {
            m_isOpen = true;
            ui->btnOpenSerialPort->setText("关闭串口");
            setLED(ui->label_led, 2, 20); // 绿灯
        }
    }
}

/**
 * @brief 封装发送数据函数
 */
void Widget::SerialSendData()
{
    QByteArray byteArr;
    QString textToSend;

    /* 串口未打开，直接退出 */
    if (!m_serial->isOpen())
    {
        return;
    }

    /* 获取要发送的文本 */
    textToSend = ui->textEdit_Send->toPlainText();

    /* 把\n换成\r\n */
    textToSend.replace("\n", "\r\n");

    /* 发送 */
    byteArr.append(textToSend.toUtf8());

    m_serial->write(byteArr);
    //m_serial->write(textToSend.toStdString().c_str());
}

/**
 * @brief 发送按钮回调
 */
void Widget::on_btnSend_clicked()
{
    /* 发送数据 */
    SerialSendData();
}

/**
 * @brief 自动发送定时器超时
 */
void Widget::TimerTimeout()
{
    int time;

    if (ui->checkBoxAutoSend->isChecked() && m_serial->isOpen())
    {
        /* 发送数据 */
        SerialSendData();

        // 重新获取自动发送的间隔时间
        time = ui->spinBoxAutoSendSpace->value();
        m_timer->start(time);
    }
    else
    {
        m_timer->stop();
    }
}

/**
 * @brief 自动发送选项状态改变
 * @param arg1
 */
void Widget::on_checkBoxAutoSend_stateChanged(int arg1)
{
    int time;

    /* arg1未使用 */
    Q_UNUSED(arg1);

    if (ui->checkBoxAutoSend->isChecked() && m_serial->isOpen())
    {
        time = ui->spinBoxAutoSendSpace->value();
        m_timer->start(time);
    }
    else
    {
        m_timer->stop();
    }
}

/**
 * @brief 串口有数据可读
 */
void Widget::serial_readyRead()
{
    QByteArray byteArr;

    /* 串口未打开，直接退出 */
    if (!m_serial->isOpen())
    {
        return;
    }

    /* 读数据 */
    byteArr = m_serial->readAll();

    /* 显示在接收区 */
    if (!m_stopShow)
        ui->textBrowser_Recv->append(QString(byteArr));
}

/**
 * @brief 清空接收区（只清空显示）
 */
void Widget::on_btnClearRecv_clicked()
{
    ui->textBrowser_Recv->clear();
}

/**
 * @brief 停止显示
 */
void Widget::on_btnStopShow_clicked()
{
    if (m_stopShow)
    {
        ui->btnStopShow->setText("停止显示");
        m_stopShow = false;
    }
    else
    {
        ui->btnStopShow->setText("显示接收");
        m_stopShow = true;
    }
}

/**
 * @brief 清空发送区
 */
void Widget::on_btnClearSend_clicked()
{
    ui->textEdit_Send->clear();
}


